#!/bin/bash
# 🌟 炫酷的 Rust 项目部署脚本 - SyncClipboard 🌟
# ============================================
# 功能: 一键部署、彩色输出、进度条、错误处理、日志记录、Docker镜像构建
# 🎨 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
MAGENTA='\033[0;35m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color

# 📌 配置部分 =====
# 🖥️ 服务器配置
SERVER_IP="150.158.107.119"          # 替换为你的服务器IP
SERVER_USER="ubuntu"                  # 替换为你的服务器用户名
SERVER_ADDR="$SERVER_USER@$SERVER_IP"    # 服务器SSH地址
SERVER_PORT=22                       # SSH端口
SERVER_DIR="/opt/sync_clipboard"      # 服务器上的部署目录

# 应用配置
APP_NAME="sync_clipboard"                  # 应用名称
BIN_NAME="main"                      # 编译后的二进制文件名
SYSTEMD_SERVICE="sync_clipboard.service"   # systemd服务名

# 本地配置
PROJECT_DIR="$HOME/Desktop/SyncClipboard/backend" # 本地项目目录
TARGET="x86_64-unknown-linux-musl"   # 使用 musl 静态链接

# 镜像配置
IMAGE_NAME="sync_clipboard_build"
IMAGE_TAG="latest"

# ===== 脚本开始 =====\
set -e # 任何命令失败则退出脚本

# Docker环境检查
if ! command -v docker &> /dev/null; then
    echo -e "${RED}❌ 未检测到Docker环境${NC}\n${YELLOW}请先安装Docker: https://docs.docker.com/get-docker/${NC}"
    exit 1
fi

# 检查镜像是否存在或询问是否重建
REBUILD_IMAGE=false
if [[ -z "$(docker images -q $IMAGE_NAME:$IMAGE_TAG 2> /dev/null)" ]]; then
    REBUILD_IMAGE=true
else
    read -p "检测到已有镜像 $IMAGE_NAME:$IMAGE_TAG 是否重新构建？[y/N]: " rebuild_choice
    if [[ "$rebuild_choice" =~ ^[Yy]$ ]]; then
        REBUILD_IMAGE=true
    else [[ "$rebuild_choice" =~ ^[Nn]$ ]];
        echo "使用现有镜像 $IMAGE_NAME:$IMAGE_TAG"
    fi
fi

if $REBUILD_IMAGE; then
    echo "===== 构建Docker镜像 ====="
    docker build --platform linux/amd64 -t $IMAGE_NAME:$IMAGE_TAG . || {
        echo "❌ 镜像构建失败";
        exit 1;
    }
fi


echo -e "${MAGENTA}🌟 开始部署 $APP_NAME 🌟${NC}"
echo -e "${BLUE}📁 本地项目目录:${NC} $PROJECT_DIR"
echo -e "${BLUE}🌐 目标服务器:${NC} $SERVER_ADDR:$SERVER_DIR"

# 步骤1: 编译项目
echo -e "\n${CYAN}🚀 使用 Docker 编译 Rust 项目 (目标平台: $TARGET)${NC}"
cd "$PROJECT_DIR"
docker run --rm --platform linux/amd64 -v "$PROJECT_DIR":/volume -w /volume $IMAGE_NAME:$IMAGE_TAG \
    sh -c "cargo build --release --target $TARGET"

# 检查编译是否成功
if [ ! -f "$PROJECT_DIR/target/$TARGET/release/$BIN_NAME" ]; then
    echo "❌ 编译失败，请检查错误"
    exit 1
fi

# 步骤2: 上传文件
echo -e "\n${YELLOW}📤 上传文件到服务器${NC}"
BINARY_PATH="$PROJECT_DIR/target/$TARGET/release/$BIN_NAME"
CONFIG_PATH="$PROJECT_DIR/.config/Config.toml"
# LOG_CONFIG_PATH="$PROJECT_DIR/log4rs.yaml"

# 上传前先停止服务
# 清理垃圾文件
# 创建服务器目录并设置权限
ssh -p $SERVER_PORT $SERVER_ADDR \
    "sudo systemctl stop $SYSTEMD_SERVICE 2>/dev/null || true && \
    sudo rm -rf ./* && \
    sudo install -d -o $SERVER_USER -g $SERVER_USER $SERVER_DIR && \
    sudo install -d -o $SERVER_USER -g $SERVER_USER $SERVER_DIR/.config"

scp -P $SERVER_PORT \
    "$BINARY_PATH" "$SERVER_ADDR:$SERVER_DIR/$BIN_NAME"

scp -P $SERVER_PORT \
    "$CONFIG_PATH" "$SERVER_ADDR:$SERVER_DIR/"

ssh -p $SERVER_PORT $SERVER_ADDR \
    "mv $SERVER_DIR/Config.toml $SERVER_DIR/.config/ && \
     chmod 755 $SERVER_DIR/.config/Config.toml"

# 步骤3: 服务器端部署
echo -e "\n${GREEN}🛠️ 在服务器上设置应用${NC}"

ssh -p $SERVER_PORT $SERVER_ADDR "bash -s" <<EOF
#!/bin/bash
set -e

# 创建systemd服务文件
sudo tee /etc/systemd/system/$SYSTEMD_SERVICE > /dev/null <<SERVICE_EOF
[Unit]
Description=$APP_NAME Service
After=network.target

[Service]
User=$SERVER_USER
WorkingDirectory=$SERVER_DIR
ExecStart=$SERVER_DIR/$BIN_NAME
Restart=always
RestartSec=3

Environment="RUST_LOG=info"
Environment="CONFIG_PATH=$SERVER_DIR/.config/Config.toml"
# Environment="LOG_CONFIG_PATH=$SERVER_DIR/log4rs.yaml"

# 安全设置
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=full

[Install]
WantedBy=multi-user.target
SERVICE_EOF

# 设置可执行权限
chmod +x $SERVER_DIR/$BIN_NAME

# 启用并重启服务
sudo systemctl daemon-reload
sudo systemctl enable $SYSTEMD_SERVICE
sudo systemctl restart $SYSTEMD_SERVICE

echo "✅ 服务已部署并启动"
EOF

# 步骤4: 增强验证部署
echo -e "\n${BLUE}🔍 验证部署${NC}"
sleep 5 # 等待服务启动

# 检查服务状态，失败时显示日志
if ssh -p $SERVER_PORT $SERVER_ADDR "systemctl is-active $SYSTEMD_SERVICE" | grep -q "active"; then
    echo -e "${GREEN}✅ 服务正在运行!${NC}\n${CYAN}访问地址: http://$SERVER_IP:20505${NC}"
    ssh -p $SERVER_PORT $SERVER_ADDR \
        "systemctl status $SYSTEMD_SERVICE --no-pager"
else
    echo -e "${RED}❌ 服务启动失败${NC}\n${YELLOW}查看日志:${NC}"
    ssh -p $SERVER_PORT $SERVER_ADDR \
        "journalctl -u $SYSTEMD_SERVICE --since '1 min ago' --no-pager"
    exit 1
fi

echo -e "\n✅ 部署成功完成! $APP_NAME 已在服务器上运行"